#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>

#define SHM_NAME "/my_shared_memory"  // 共享内存对象名称
#define BUFFER_SIZE 1024              // 共享缓冲区大小

// 共享内存结构，必须与发送端完全一致
typedef struct {
    int ready;          // 发送方就绪标志
    char buffer[BUFFER_SIZE];  // 数据缓冲区
} SharedData;

int main() {
    int fd;
    SharedData *shared_data;

    // 打开已存在的共享内存对象
    fd = shm_open(SHM_NAME, O_RDWR, 0666);
    if (fd == -1) {
        perror("shm_open failed");
        exit(EXIT_FAILURE);
    }

    // 将共享内存映射到进程地址空间
    shared_data = (SharedData *)mmap(NULL, sizeof(SharedData), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (shared_data == MAP_FAILED) {
        perror("mmap failed");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 关闭文件描述符，映射成功后不再需要
    close(fd);

    printf("共享内存接收端已启动，等待消息...\n");

    while (1) {
        // 等待发送方准备好数据
        while (!shared_data->ready) {
            usleep(100000);  // 等待100ms
        }

        // 读取共享内存中的消息
        printf("收到消息: %s\n", shared_data->buffer);

        // 处理完消息，重置就绪标志
        shared_data->ready = 0;

        // 检查是否退出
        if (strcmp(shared_data->buffer, "exit") == 0) {
            break;
        }
    }

    // 解除内存映射
    if (munmap(shared_data, sizeof(SharedData)) == -1) {
        perror("munmap failed");
        exit(EXIT_FAILURE);
    }

    printf("接收端已退出\n");
    return 0;
}

